package com.mlh.binarytree;

import java.util.Map;

/**
 * @author 缪林辉
 * @date 2024/8/29 10:50
 * @DESCRIPTION
 */
//二叉树中的 路径 被定义为一条节点序列，序列中每对相邻节点之间都存在一条边。
// 同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点，且不一定经过根节点。
// 路径和 是路径中各节点值的总和。
// 给你一个二叉树的根节点 root ，返回其 最大路径和 。
public class 二叉树中的最大路径和 {
    //做这题之前可以，做一下  二叉树的直径
    // 本题有两个关键概念：
    // 链：从叶子到当前节点的路径。其节点值之和是 dfs 的返回值。
    // 直径：等价于由两条（或者一条）链拼成的路径。我们枚举每个 node，
    // 假设直径在这里「拐弯」，也就是计算由左右两条从叶子到 node 的链的节点值之和，去更新答案的最大值。
    // 作者：灵茶山艾府
    int res=Integer.MIN_VALUE;
    public int method1(TreeNode root) {
        if(root==null){
            return 0;
        }
        recursion(root);
        return res;
    }

    private int recursion(TreeNode root) {
        if(root==null){
            return 0;
        }
        int left=recursion(root.left);
        int right=recursion(root.right);
        res= Math.max(left+right+root.val,res);
        //如果链之和为负数，则返回0，情愿不要这条链
        return Math.max(Math.max(left,right)+root.val,0);
    }

    public int practice(TreeNode root) {
        recursionPractice(root);
        return res;
    }
    //返回的是node为根节点的树拥有的最大和的链
    private int recursionPractice(TreeNode node) {
        if(node==null){
            return 0;
        }
        int left=recursionPractice(node.left);
        int right=recursionPractice(node.right);
        res=Math.max(res,left+right+node.val);
        return Math.max(Math.max(left,right)+node.val,0);
    }
}
